/*************************************************************************
	> File Name: oj-349.cpp
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2021年02月04日 星期四 22时30分35秒
 ************************************************************************/
#include <iostream>
using namespace std;

// 本质上是最长下降子序列问题
#define MAX_N 5000
// 状态定义
// dp[i] 第i天，最大下降子序列长度
// f[i] 第i天，长度满足最下降子序列长度的方案数
int val[MAX_N + 5], dp[MAX_N + 5], f[MAX_N + 5], n, ans, sum;

int main() {
    cin >> n;
    for (int i = 1; i <= n; ++i) cin >> val[i]; //读入序列
    for (int i = 1; i <= n; ++i) {
        dp[i] = 1;
        //求出i位置时最大下降子序列长度
        for (int j = 1; j < i; ++j) {
            if (val[j] > val[i]) {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
        if (dp[i] == 1) f[i] = 1; //如果最大下降子序列长度为1，则有1个方案
        for (int j = 1; j < i; ++j) {
            //确实是从j转移到i的情况
            if (val[j] > val[i] && dp[j] + 1 == dp[i]) f[i] += f[j];
            //j不能转移到i，但是dp[i]和dp[j]相同的情况（去重）
            if (val[j] == val[i] && dp[i] == dp[j]) f[j] = 0;
        }
        cout << "i = " << i << " val[" << i << "] = " << val[i]
             << " dp[" << i << "] = " << dp[i]
             << " f[" << i << "] = " << f[i] << endl;
        ans = max(ans, dp[i]);
    }
    for (int i = 1; i <= n; ++i) {
        if (dp[i] == ans) sum += f[i]; //如果i位置更新了序列长度，方案数+f[i]
    }
    cout << ans << " " << sum << endl;
    return 0;
}
